package Question20_10; import java.awt.List; import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedList; import java.util.Map; import java.util.Queue; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; public class Question { public static LinkedList<String> transform(String startWord, String stopWord, Set<String> dictionary) { startWord = startWord.toUpperCase(); stopWord = stopWord.toUpperCase(); Queue<String> actionQueue = new LinkedList<String>(); Set<String> visitedSet = new HashSet<String>(); Map<String, String> backtrackMap = new TreeMap<String, String>(); actionQueue.add(startWord); visitedSet.add(startWord); while (!actionQueue.isEmpty()) { String w = actionQueue.poll(); // For each possible word v from w with one edit operation for (String v : getOneEditWords(w)) { if (v.equals(stopWord)) { // Found our word! Now, back track. LinkedList<String> list = new LinkedList<String>(); // Append v to list list.add(v); while (w != null) { list.add(0, w); w = backtrackMap.get(w); } return list; } // If v is a dictionary word if (dictionary.contains(v)) { if (!visitedSet.contains(v)) { actionQueue.add(v); visitedSet.add(v); // mark visited backtrackMap.put(v, w); } } } } return null; } private static Set<String> getOneEditWords(String word) { Set<String> words = new TreeSet<String>(); // for every letter for (int i = 0; i < word.length(); i++) { char[] wordArray = word.toCharArray(); // change that letter to something else for (char c = 'A'; c <= 'Z'; c++) { if (c != word.charAt(i)) { wordArray[i] = c; words.add(new String(wordArray)); } } } return words; } public static HashSet<String> setupDictionary(String[] words) { HashSet<String> hash = new HashSet<String>(); for (String word : words) { hash.add(word.toUpperCase()); } return hash; } public static void main(String[] args) { String[] words = {"maps", "tan", "tree", "apple", "cans", "help", "aped", "free", "apes", "flat", "trap", "fret", "trip", "trie", "frat", "fril"}; HashSet<String> dict = setupDictionary(words); LinkedList<String> list = transform("tree", "flat", dict); for (String word : list) { System.out.println(word); } } }